【Leetcode】【python】Convert Sorted Array to Binary Search Tree

题目大意

将一个排序好的数组转换为一颗二叉查找树,这颗二叉查找树要求是平衡的。

知识点

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
任意节点的左、右子树也分别为二叉查找树;
没有键值相等的节点。

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。

解题思路

由于要求二叉查找树是平衡的。所以我们可以选在数组的中间那个数当树根root,然后这个数左边的数组为左子树,右边的数组为右子树,分别递归产生左右子树就可以了。

注意:如果是偶数个数的数组,那么答案就有多种可能。

这也是为什么我的代码分为奇数偶数判定,而标准答案没用,经过测试,两种代码生成两种不同的答案,并且leetcode系统都能接受。

代码

我提交的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution(object):
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
if len(nums) == 0:
return None
if len(nums) == 1:
return TreeNode(nums[0])
if len(nums)%2 == 1:
tree = TreeNode(nums[len(nums)/2])
tree.left = self.sortedArrayToBST(nums[:(len(nums)/2)])
tree.right = self.sortedArrayToBST(nums[-(len(nums)/2):])
else:
tree = TreeNode(nums[len(nums)/2-1])
tree.left = self.sortedArrayToBST(nums[:(len(nums)/2)-1])
tree.right = self.sortedArrayToBST(nums[-(len(nums)/2):])
return tree

标准代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution:
# @param num, a list of integers
# @return a tree node
def sortedArrayToBST(self, num):
length = len(num)
if length == 0:
return None
if length == 1:
return TreeNode(num[0])
root = TreeNode(num[length / 2])
root.left = self.sortedArrayToBST(num[:length/2])
root.right = self.sortedArrayToBST(num[length/2 + 1:])
return root

总结

  1. 已经做了很多递归的题目了,这种解题结构已经定型了,很多题目都可以这样套
  2. 切片